//
//  UIButton+Block.m
//  Beckon
//
//  Created by zL on 2017/3/6.
//  Copyright © 2017年 zL. All rights reserved.
//

/*
 
 UIControlEventTouchDown
 单点触摸按下事件：用户点触屏幕，或者又有新手指落下的时候。
 UIControlEventTouchDownRepeat
 多点触摸按下事件，点触计数大于1：用户按下第二、三、或第四根手指的时候。
 UIControlEventTouchDragInside
 当一次触摸在控件窗口内拖动时。
 UIControlEventTouchDragOutside
 当一次触摸在控件窗口之外拖动时。
 UIControlEventTouchDragEnter
 当一次触摸从控件窗口之外拖动到内部时。
 UIControlEventTouchDragExit
 当一次触摸从控件窗口内部拖动到外部时。
 
 UIControlEventTouchUpInside
 所有在控件之内触摸抬起事件。
 UIControlEventTouchUpOutside
 所有在控件之外触摸抬起事件(点触必须开始与控件内部才会发送通知)。
 UIControlEventTouchCancel
 所有触摸取消事件，即一次触摸因为放上了太多手指而被取消，或者被上锁或者电话呼叫打断。
 UIControlEventTouchChanged
 当控件的值发生改变时，发送通知。用于滑块、分段控件、以及其他取值的控件。你可以配置滑块控件何时发送通知，在滑块被放下时发送，或者在被拖动时发送。
 UIControlEventEditingDidBegin
 当文本控件中开始编辑时发送通知。
 UIControlEventEditingChanged
 当文本控件中的文本被改变时发送通知。
 UIControlEventEditingDidEnd
 当文本控件中编辑结束时发送通知。
 UIControlEventEditingDidOnExit
 当文本控件内通过按下回车键（或等价行为）结束编辑时，发送通知。
 UIControlEventAlltouchEvents
 通知所有触摸事件。
 UIControlEventAllEditingEvents
 通知所有关于文本编辑的事件。
 UIControlEventAllEvents
 通知所有事件。
 
 */
#import <UIKit/UIKit.h>
#import "UIButton+Block.h"

@implementation UIButton(Block)

static char overviewKey;

@dynamic event;

- (void)addTargetWithControlEvents:(UIControlEvents)controlEvents withBlock:(ButtonActionBlock)block{
    
    objc_setAssociatedObject(self, &overviewKey, block, OBJC_ASSOCIATION_COPY_NONATOMIC);
    
    [self addTarget:self action:@selector(callActionBlock:) forControlEvents:controlEvents];
}

- (void)callActionBlock:(id)sender {
    ButtonActionBlock block = (ButtonActionBlock)objc_getAssociatedObject(self, &overviewKey);
    if (block) {
        block(sender);
    }
}


@end
